Ładowanie bibliotek

library(dplyr)
library(ggplot2) 
library('corrplot')
library(caret)
library(plotly)
library(tidyr)

Wczytywanie danych z pliku

all_data <- read.csv(file="elektrownie.csv", header=TRUE, sep=",")

Kod przetwarzający dane

Zmiana nazw kolumn

Ze względu na wykorzystanie języka włoskiego do opisu kolumn lub nieintuicyjnych nazw zdecydowano się na zmianę nazw kolumn.

needed_data <- all_data 
colnames(needed_data) <- c("measurementId", "place", "model", "brand", "latitude","longitude", "age", "year", "day", "hour", "date", "temperature", "radiation", "pressure", "windspeed", "humidity", "icon" , "dewpoint", "bearing", "cloudcover", "temp_param", "radiation_param", "pressure_param", "wind_param", "humidity_param", "dewpoint_param","bearing_param", "cloud_param", "distance", "altitude", "azimuth", "altitude_param", "azimuth_param","pcnm1", "pcnm2", "pcnm3", "pcnm4", "pcnm5", "pcnm6", "pcnm7", "pcnm8", "pcnm9", "pcnm10", "pcnm11", "pcnm12", "pcnm13", "pcnm14", "pcnm15", "mode", "mode_param","energy")

W celu łatwiejszego porównywania dat w poszczególnych wierszach (pomiarach) do zbioru dodano 4 kolumny: 1. only_month - kolumna typu numeric, zawiera informacje o miesiącu, wartości od 1 do 12, 2. only_day - kolumna typu numeric, zawiera informacje o dniu miesiąca, wartości od 1 do 31, 3. only_hour - kolumna typu numeric, zawiera informacje o godzinie (bez minut), wartości od 2 do 20, 4. date_posix - kolumna typu POSIXct, zawiera datę w formacie umożliwiiającym łatwe porównywanie dat. Dodatkowo dodano kolumne place_string zawierającą zagregowane informacje o lokalizacji danego panelu

needed_data$only_day <- as.numeric(format(as.POSIXct(factor(needed_data$date),format="%m/%d/%Y %H:%M"),"%d"))
needed_data$only_month <- as.numeric(format(as.POSIXct(factor(needed_data$date),format="%m/%d/%Y %H:%M"),"%m"))
needed_data$only_hour <- as.numeric(format(as.POSIXct(factor(needed_data$date),format="%m/%d/%Y %H:%M"),"%H"))
needed_data$date_posix <- as.POSIXct(as.character(needed_data$date), format="%m/%d/%Y %H:%M")
needed_data$place_string <- paste("Wsp: ", as.character(needed_data$latitude), " ",as.character(needed_data$longitude), " Panel: ", as.character(needed_data$place))

Uzupełnienie zerowych wartości

Wyodrębnienie modeli, marek oraz umiejscowienia czujników

W zbiorze występują dane dla 17 różnych paneli słonecznych znajdujących się w 14 różnych lokalizacji w 3 różnych elektrowniach.

Marki

idbrands <- unique(needed_data$brand)
idbrands
## [1] 0.083 0.000 0.167 0.333 0.250 0.417
paste("Liczba unikalnych marek paneli: ", length(idbrands))
## [1] "Liczba unikalnych marek paneli:  6"

Modele paneli

idbrands_with_models <- unique(needed_data[c("brand", "model")])
idbrands_with_models
##    brand model
## 1  0.083 0.083
## 2  0.083 0.208
## 3  0.000 0.375
## 4  0.167 0.292
## 5  0.333 0.000
## 6  0.000 0.417
## 7  0.000 0.458
## 8  0.167 0.167
## 11 0.250 0.250
## 14 0.417 0.125
## 15 0.333 0.750
paste("Liczba unikalnych modeli paneli: ", length(idbrands_with_models))
## [1] "Liczba unikalnych modeli paneli:  2"

Identyfikatory paneli

idplaces <- unique(needed_data$place)
idplaces
##  [1] 0.425 0.250 0.350 0.325 0.000 0.375 0.400 0.125 0.225 0.075 0.300
## [12] 0.150 0.200 0.050 0.025 0.275 0.100
paste("Liczba paneli: ", length(idplaces))
## [1] "Liczba paneli:  17"

Lokalizacje

gps <- unique(needed_data[c("latitude", "longitude")])
gps
##    latitude longitude
## 1     0.437     0.631
## 2     0.437     0.620
## 3     0.439     0.626
## 4     0.440     0.612
## 5     0.436     0.626
## 6     0.552     0.154
## 7     0.553     0.160
## 8     0.415     0.691
## 10    0.437     0.624
## 11    0.440     0.585
## 12    0.438     0.630
## 13    0.436     0.625
## 14    0.437     0.622
## 17    0.434     0.630
paste("Liczba unikalnych lokalizacji: ", length(gps))
## [1] "Liczba unikalnych lokalizacji:  2"

Lokalizacja wraz z identyfikatorem panelu

gps_with_places_id <- unique(needed_data[c("latitude", "longitude", "place")])
gps_with_places_id
##    latitude longitude place
## 1     0.437     0.631 0.425
## 2     0.437     0.620 0.250
## 3     0.439     0.626 0.350
## 4     0.440     0.612 0.325
## 5     0.436     0.626 0.000
## 6     0.552     0.154 0.375
## 7     0.553     0.160 0.400
## 8     0.415     0.691 0.125
## 9     0.437     0.620 0.225
## 10    0.437     0.624 0.075
## 11    0.440     0.585 0.300
## 12    0.438     0.630 0.150
## 13    0.436     0.625 0.200
## 14    0.437     0.622 0.050
## 15    0.437     0.631 0.025
## 16    0.437     0.622 0.275
## 17    0.434     0.630 0.100

Analiza uzupełnienia wartości

Przed dokonaniem wyliczenia wartości pustych warto zauważyć, że w zbiorze występuje 78521 wierszy, które posiadają wyprodukowaną energię na poziomie 0, 78489 wierszy, które posiadają zmierzony poziom nasłonecznienia na poziomie 0 oraz 72864 wierszy, które posiadają obie wspomniane wartości na poziomie 0. Kierując się tymi obserwacjami, możemy dostrzec, że w przypadku prawie 6 tys. wierszy, które mają nasłonecznienie na poziomie 0 oraz energie większą niż 0 mogła nastąpić awaria czujnika nasłonecznienia, natomiast w przypadku wierszy, które mają nasłonecznienie większe od 0, a wyprodukowaną energię na poziomie 0, elektrownia mogła zostać wyłączona (czujnik dokonywał ciągle pomiarów parametrów środowiska) lub niepoprwnie zapisano liczbę kwh wyprodukowanej energii.

Ciśnienie

Ze względu na to, że w zbiorze występują dla cisnienia (pressure) tylko wartości zerowe albo większe niż 0.7, uznano, że zerowe wartości są wynikiem awarii czujników i zastąpiono je średnią niezerowych wartości ciśnienia dla określonej lokalizacji. Jeśli wystąpiłaby sytuacja, że dla danej lokalizacji nie byłoby żadnego pomiaru ciśnienia to wartości zerowe zastępowane sa średnią ciśnienia dla wszystkich lokalizacji.

for(idplace in idplaces) {
  average_value <- mean(needed_data$pressure[needed_data$pressure > 0 & needed_data$place == idplace])
  if(!is.na(average_value)) {
    needed_data$pressure[needed_data$pressure == 0 & needed_data$place == idplace] <- average_value
  }
}

Nasłonecznienie

Założono, że w nocy nasłonecznienie wynosi 0 (co wynika również z analizy pozyskanych danych), stąd zastapiono tylko wartości zerowe dla nasłonecznienia (radiation) z przediału godzinnego <5;20> oraz wyprodukowaną energią większą niż 0. Wartości zerowe zastąpiono średnią wartościa parametru dla danego czujnika w danym miesiącu o danej godzinie.

empty_values <- needed_data %>% filter(radiation == 0 & only_hour > 4 & only_hour  < 20 & energy > 0)
not_empty_values <- needed_data %>% filter(radiation > 0 & only_hour > 4 & only_hour  < 20)
for(idplace in idplaces) {
  empty_radiation <- empty_values %>% filter(place == idplace)
  if(nrow(empty_radiation) > 0) {
    for(i in 1:nrow(empty_radiation)) {
      row <- empty_radiation[i, ]
      cloudcover_low <- row$cloudcover - 0.2
      cloudcover_up <- row$cloudcover + 0.2
      radiation_column <- not_empty_values %>% filter(place == idplace & only_hour == row$only_hour & only_month == row$only_month & cloudcover > cloudcover_low & cloudcover < cloudcover_up) %>% select(radiation)
      if(nrow(radiation_column) > 0) {
        average_value <- mean(radiation_column$radiation)
          if(!is.na(average_value)) {
              needed_data$radiation[which(needed_data$measurementId == row$measurementId)] <- average_value
          }
      }
    }
  }
}

Podstawowe statystyki

Wszystkie wartości w zbiorze oprócz daty wykonania pomiaru zostały znormalizowane. Parametry możemy podzielić na niedyskretne (ze względu na nieznajomość dokładności pomiarów w okreslonym zakresie działania, np. temperatura przed dokonaniem normalizacji wartości mogła być mierzona z różną dokładnością w zakresie [x;y]) oraz dyskretne (określony zbiór wartości, np. id panelu). Stąd statystyki danego parametru przedstawiono w zależności od jego typu.

## [1] "Rozmiar zbioru:  235790"

Statystyki wartości niedsykretnych w zbiorze

Średnia Wartość minimalna Wartość maksymalna Odchylenie standardowe Liczba zerowych wartości 1. kwartyl 2. kwartyl 3. kwartyl
age 0.3144706 0.000 1.000 0.3779699 69350 0.0000000 0.1250000 0.719000
temperature 0.3734429 0.045 0.818 0.1722182 0 0.2120000 0.3480000 0.530000
radiation 0.1111735 0.000 0.710 0.1343706 73949 0.0000000 0.0400000 0.208000
pressure 0.7529589 0.730 0.769 0.0044807 0 0.7510000 0.7530000 0.755000
windspeed 0.0762241 0.000 0.696 0.0501477 1070 0.0420000 0.0660000 0.102000
humidity 0.6843925 0.160 1.000 0.1817457 0 0.5400000 0.7000000 0.840000
dewpoint 0.6055304 0.139 0.865 0.0956441 0 0.5350000 0.6190000 0.683000
bearing 0.4512351 0.000 0.769 0.2303888 2520 0.3000000 0.4780000 0.660000
cloudcover 0.3590429 0.000 1.000 0.2595479 38394 0.2300000 0.3100000 0.510000
temp_param 0.1224742 0.009 0.983 0.0631091 0 0.0730000 0.1110000 0.126000
radiation_param 0.2220020 0.108 1.000 0.0115436 0 0.2160000 0.2200000 0.222000
pressure_param 0.0002370 0.000 1.000 0.0039993 233263 0.0000000 0.0000000 0.000000
wind_param 0.0385247 0.000 1.000 0.0048811 2 0.0370000 0.0380000 0.039000
humidity_param 0.0638395 0.034 0.579 0.0420096 0 0.0440000 0.0440000 0.062000
dewpoint_param 0.1193809 0.063 0.415 0.0133907 0 0.1140000 0.1140000 0.118000
bearing_param 0.3454981 0.000 1.000 0.0340350 1 0.3360000 0.3360000 0.339000
cloud_param 0.2061627 0.000 1.000 0.0300724 1 0.1960000 0.1960000 0.198000
distance 0.4686464 0.000 1.000 0.2967915 570 0.1912568 0.4590164 0.726776
altitude 0.5463627 0.111 0.884 0.1806407 0 0.4190000 0.5640000 0.681000
azimuth 0.4545834 0.128 0.818 0.1965414 0 0.2950000 0.4250000 0.635000
altitude_param 0.2055096 0.000 0.982 0.1494217 1 0.0960000 0.1360000 0.266000
azimuth_param 0.3652845 0.000 1.000 0.1822820 1 0.2090000 0.2880000 0.482000
pcnm1 0.4223529 0.000 1.000 0.2043798 13870 0.3770000 0.3780000 0.380000
pcnm2 0.3537647 0.000 0.972 0.2142737 13870 0.2500000 0.3770000 0.422000
pcnm3 0.6044706 0.000 1.000 0.2170462 13870 0.5510000 0.6050000 0.730000
pcnm4 0.5189412 0.000 1.000 0.2555701 13870 0.3630000 0.5310000 0.634000
pcnm5 0.4164706 0.000 1.000 0.2502325 13870 0.3310000 0.4270000 0.462000
pcnm6 0.4940588 0.000 1.000 0.2392556 13870 0.3390000 0.4930000 0.493000
pcnm7 0.1141765 0.000 1.000 0.2249332 13870 0.0310000 0.0520000 0.114000
pcnm8 0.4033529 0.000 1.000 0.2636083 13870 0.2040000 0.4120000 0.511000
pcnm9 0.5371176 0.000 1.000 0.2616246 13870 0.5270000 0.5320000 0.600000
pcnm10 0.6276471 0.000 1.000 0.2123752 13870 0.5530000 0.6190000 0.717000
pcnm11 0.3236471 0.000 1.000 0.2066428 13870 0.2570000 0.3270000 0.327000
pcnm12 0.7567647 0.000 1.000 0.2289319 13870 0.7480000 0.7600000 0.884000
pcnm13 0.6500588 0.137 1.000 0.1995126 0 0.6140000 0.6140000 0.738000
pcnm14 0.4892941 0.000 1.000 0.1838311 13870 0.4320000 0.4730000 0.530000
pcnm15 0.5709412 0.000 1.000 0.2046190 13870 0.6120000 0.6140000 0.615000
mode 0.1767311 0.000 1.000 0.2210455 94008 0.0000000 0.0560000 0.325000
mode_param 0.1967021 -0.025 1.006 0.0534842 2 0.1580000 0.1940000 0.213000
energy 0.1687714 0.000 1.000 0.2106090 78521 0.0000000 0.0490000 0.332000

Statystyki wartości dyskretnych w zbiorze

Wartość minimalna Wartość maksymalna Liczba unikalnych wartości
place 0.000 0.425 17
brand 0.000 0.417 6
latitude 0.415 0.553 9
longitude 0.154 0.691 12
day 0.000 1.000 365
hour 0.000 1.000 19
measurementId 1.000 276488.000 235790
model 0.000 0.750 11
year 2012.000 2013.000 2
icon 0.000 0.750 7

Rozkłady wartości

W tej sekcji zostały przedstawione rozkłady wartości wybranych atrybutów niedyskretnych.

Korelacja

Celem analizy jest znalezienie czynników, które najlepiej wpływają na ilość wyprodukowanej energii. Język statystyki takie związki nazywa korelacją. Gdy korelacja jest dodatnie to wraz ze wzrostem wartości parametru X rośnie wartość parametru Y, natomiast jeśli jest ujemna to wraz ze wzrostem wartości parametru X maleje wartość parametru Y.

Macierz korelacji wszystkich parametrów

Aby obliczyć współczynnik korelacji wykorzystano współczynnik korelacji liniowej Pearsona. Przyjmuje się, że jeśli współczynnik korelacji mieści się pomiędzy <-0.2;0.2> to pomiędzy parametrami X i Y nie występuje korelacja, czyli nie ma związku. Przeanalizowano najpierw, które parametry są najmocniej skorelowane z produkowaną energią (energy). Według przedstawionej macierzy korelacji największy dodatni wpływ na produkowaną energię ma parametr radiation, czyli promieniowanie słoneczne. Natomiast największy negatywny wpływ na produkowaną energię ma parametr humidity, czyli wilgotność. Warto tutaj zauważyć, że związek też spowodowany jest tym, że wzrost promieniowania słonecznego wpływa na zmniejszenie wilgotności, co za tym idzie jeśli wilgotność jest wysoka, to promieniowanie słoneczne ma niższą wartość. Stąd wysoka ujemna korelacja pomiędzy wilgotnością a produkowaną energią. Duży dodatni wpływ na produkowaną energię ma także parametr mode, który jest prawdopodobnie wartością obliczoną na podstawie wartości nasłonecznienia oraz wilgotności (analizując wartości korelacji dla tego parametru). Warto tutaj zauważyć, że zachmurzenie (cloudcover) nie ma praktycznie żadnego wpływu na wartość promieniowania słonecznego (współczynnik korelacji mniejszy niż 0.2).

Wykresy

Na podstawie macierzy korelacji wybrano najciekawsze związki i przedstawiono je na wykresach, osobno dla każdego panelu.

Wykres zależności wyprodukowanej energii od promieniowania słonecznego

Wykres zależności wyprodukowanej energii od wilgotności

Wykres zależności wyprodukowanej energii od parametru mode

Wykres zależności wilgotności od nasłonecznienia

Zmiana wytwarzanej energii w czasie

Zmiana wytwarzanej energii w czasie w ujęciu godzinowym dla każdego panelu

Na przedstawionym wykresie dla niektórych paneli (id 0.05, 0.075, 0.025, 0.425) można zauważyć problem zerowych wartości produkowanej energii, który analizowano wcześniej. Nie zostało stwierdzone, czy w miesiącach, w których wyprodukowana energia jest na niskim poziomie lub zerowym jesy wynikiem błędów pomiarowych czy nieprodukowaniem energii przez elektrownie.

#Regresor

Zapewnienie powtarzalności wyników